package utils;

import com.bestpay.ext.logback.util.TraceLogIdUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.UUID;

import static com.yangjicong.o2o.studey.base.common.enums.Constants.convertNumber;


/**
 * <p>
 *  1.生成流水
 *  2.生成日志ID
 *  3.元转分
 *  4.json字符串转成java对象
 *  5.在字符串指定位置插入指定字符
 *  6.分转元
 *  7.如果没有超过万元则显示元
 *  8.脱敏处理
 *  9.去除小数点后面的0
 *  10.保留两位小数
 *  11.生成6位数验证码
 *
 * </p>
 * <p>Create Time: 2022年02月8日 16:01          </p>
 * <p>C@author yangjicong  </p>
 **/
@Slf4j
public class BaseUtil {


    /**
     * 生成流水
     * @return
     */
    public static String queryUuid(){
        return UUID.randomUUID().toString().replace("-", "");
    }

    /**
     * 生成日志ID
     * @return
     */
    public static String queryTraceLogId(){
        String traceLogId=TraceLogIdUtil.createTraceLogId().replace("-", "");
        return traceLogId.length()>32?traceLogId.substring(0,32):traceLogId;
    }

    /**
     * 生成日志ID
     * @return
     */
    public static String queryTraceLogId(Object param) {
        try {
            Class<?> aClass = param.getClass();
            Field field = aClass.getDeclaredField("traceLogId");
            field.setAccessible(true);
            String value = (String) field.get(param);
            if (StringUtils.isNotEmpty(value)) {
                return value;
            }
        } catch (NoSuchFieldException | IllegalAccessException | ClassCastException | NullPointerException e) {}
        return queryTraceLogId();
    }

    /**
     * 元转分
     * @param amt
     * @return
     */
    public static Long getElementByCent(String amt){
        return new BigDecimal(amt).multiply(new BigDecimal(100)).longValue();
    }

    /**
     * 分转元
     * @param amt
     * @return
     */
    public static String getLongByString(String amt){
        Long l = 0L;
        if (amt != null && amt.length() > 0) {
            l = new Long(amt);
        }
        if (l < 0) {
            return new BigDecimal(l).toString();
        }
        return new BigDecimal(l).divide(new BigDecimal(100),2, RoundingMode.HALF_UP).toString();
    }

    public static String getLongByString(Long amt){
        return getLongByString(amt == null ? "0" : amt.toString());
    }

    public static String getLongByString(Integer amt){
        return getLongByString(amt == null ? "0" : amt.toString());
    }


    /**
     * json字符串转成java对象
     *
     * @param str 字符串
     * @param type class 对象
     * @return class 对象
     */
    public static <T> T fromJson(String str, Class<T> type) {
        return GsonUtil.fromJson(str,type);
    }

    /**
     * 在字符串指定位置插入指定字符
     * @param str
     * @param num
     * @param value
     * @return
     */
    public static String getStr(String str,int num,String value){
        StringBuilder chare = new StringBuilder(str);
        chare.insert(num, value);
        return chare.toString();
    }

    /**
     * 分转元
     * @param amt
     * @return
     */
    public static String getAmtY(Long amt){
        if(null==amt){
            return StringUtils.EMPTY;
        }
        return convertNumber(BigDecimalUtil.divide(amt, 100, 2));
    }
    /**
     * 分转元
     * @param amt
     * @return
     */
    public static String getAmtF(Long amt){
        if(null==amt){
            return StringUtils.EMPTY;
        }
        return convertNumber(BigDecimalUtil.divide(amt, 100, 2));
    }


    /**
     * 如果没有超过万元则显示元,
     * 如果小数没有值是00的话  则不展示,有则保留两位小数
     * @param amt
     * @return
     */
    public static String getStringToStringAmt(String amt){
        String yuan = new BigDecimal(amt).divide(new BigDecimal(100), 1, RoundingMode.DOWN).toPlainString();
        yuan = checkPoint(yuan);
        String wan="";
        //判断整数
        if (yuan.indexOf(".") != -1){
            String substring = yuan.substring(0, yuan.indexOf("."));
            if (substring.length()<=4){
                return yuan + "元";
            }
        }
        //判断是否要转化为万单位
        if (yuan.length() > 4){
            wan= new BigDecimal(yuan).divide(new BigDecimal(10000), 2, RoundingMode.DOWN).toPlainString();
            return checkPoint(wan) + "万元";
        }
        return yuan + "元";
    }

    public static String checkPoint(String s){
        Long aLong = new Long(s.substring(s.indexOf(".")+1));
        return  aLong == 0 ?s.substring(0,s.indexOf(".")) : s;
    }


    /**
     * 脱敏处理
     * @param number 待脱敏参数
     * @param startIndex 起始字符下标
     * @param endIndex 结束字符下标
     * @return 脱敏后的结果
     */
    public static String numberEncrypt(String number,int startIndex,int endIndex){
        char [] charArray = number.toCharArray();
        if(startIndex<0 || endIndex<0 || startIndex>number.length()-1 || endIndex>number.length()-1 ){
            String errorMsg =String.format("脱敏处理异常！字符长度=%s startIndex=%s endIndex=%s",number.length(),startIndex,endIndex);
            throw new RuntimeException(errorMsg);
        }
        for(int i = startIndex ; i<= endIndex; i++){
            charArray[i] = '*';
        }
        return String.valueOf(charArray);
    }

    /**
     * 去除小数点后面的0
     */
    public static String stripTrailingZeros(String number){
        BigDecimal value = new BigDecimal(number);
        //去除多余0
        BigDecimal noZeros = value.stripTrailingZeros();
        return noZeros.toPlainString();
    }

    /**
     * 保留两位小数
     */
    public static double keepTwoDecimal(double f) {
        BigDecimal bg = new BigDecimal(f);
        return bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 生成6位数验证码
     */
    public static String keepTwoDecimal() {
        String s = String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
        System.out.println("s = " + s);
        return s;
    }



}
